# 给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
#
# 找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
#
# 返回容器可以储存的最大水量。。
#
#  示例 1：
# 输入：[1,8,6,2,5,4,8,3,7]
# 输出：49
# 解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。
#
#  示例 2：
# 输入：height = [1,1]
# 输出：1
#
from typing import List


class Solution:
    """
        双指针解法
        能盛的水始终是由两根柱子的较低者决定，
        对于两根根柱子而言高度为低者，宽度当然越宽越好（即要隔得尽量远些，所以每次移动的都是两边较小指针，就能决定这个高度能盛水的最大宽度。
    """

    def maxArea(self, heights: List[int]) -> List[int]:
        left, right, res = 0, len(heights) - 1, 0
        while left < right:
            if heights[left] <= heights[right]:
                res = max(res, (right - left) * heights[left])
                left += 1
            else:
                res = max(res, (right - left) * heights[right])
                right -= 1
        return res


if __name__ == "__main__":
    nums = [1, 8, 6, 2, 5, 4, 8, 3, 7]
    print(Solution().maxArea(nums))
